#include <string.h>
#include <iostream>
using std::cout;
using std::endl;

/**
 * .length()
 * string()
 * string(const char*)
 * string(const string& str)
 * string& operator=(const string& str)
 * operator<<
 * operator[]
 */
class string{
private:
    int _len;
    char* _str;

public:
    string(){
        _str = new char[1];
        _str[0] = '\0';
        _len = 0;
    }
    string(const char* cstr) {
        _len = strlen(cstr);
        _str = new char[_len + 1];
        strcpy(_str, cstr);
    }
    string(const string& str){
        _len = str._len;
        _str = new char[_len + 1];
        strcpy(_str, str._str);
    }
    ~string(){
        delete[] _str;
        _len = 0;
    }

public:
    string& operator=(const char* cstr){
        if(_str) delete[] _str; // 是否需要判断同一位置

        _len = strlen(cstr);
        _str = new char[_len + 1];
        strcpy(_str, cstr);

        return *this;
    }

    string& operator=(const string& str){
        if(&str == this) return *this;
        if(_str) delete[] _str; // 是否需要判断同一位置

        _len = str._len;
        _str = new char[_len + 1];
        strcpy(_str, str._str);

        return *this;
    }

    char& operator[](int i){
        if(i >= _len) return _str[0];
        return _str[i];
    }

    friend std::ostream& operator<<(std::ostream& os, const string& str){
        os << str._str;
        return os;
    }
    
public:
    int size(){ return _len;}
    const char* c_str(){ return _str;} // 返回 const



};


int main(int argc, char const *argv[])
{
    string str;
    str = "hello";
    cout << str << endl;
    cout << str.c_str() << endl;
    cout << str.size() << endl;

    string str4;

    {
        string str2("world");
        cout << str2 << endl;

        string str3(str2);
        cout << str3 << endl;

        str4 = str2;
    }

    cout << str << " " << str4 << endl;
    for(int i = 0; i < str4.size(); ++i)
        cout << str4[i] << " ";
    cout << endl;

    return 0;
}
